主题
注册日志 Skin - LogRegisterSkin
函数简介
全局注册一个自定义日志 Skin(回调输出目标)。成功时返回一个位枚举值,可与 OLA_LOG_TARGET_FILE / OLA_LOG_TARGET_CONSOLE 按位或后,通过 LogSetTarget 指定到某个日志实例。
回调类型见 OLALogSkinCallback。
接口名称
LogRegisterSkinDLL调用
c
int32_t LogRegisterSkin(int64_t instance, OLALogSkinCallback callback, int64_t userData);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| instance | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
| callback | 回调函数 | OLALogSkinCallback;不可为 NULL。 |
| userData | 长整数型 | 透传给回调的上下文,可为 0。 |
返回值
| 返回值 | 说明 |
|---|---|
> 0 | 成功,为用户 Skin 位枚举(落在 0xFFFFFF00,即 bit8..bit31)。 |
0 | 失败(callback 为空,或已满 24 个 Skin)。 |
推荐用法
LogRegisterSkin拿到skin枚举LogSetTarget(logger, FILE \| skin)(或仅skin)- 写日志;回调收到
level/raw/formatted/userData - 不再需要时
LogUnregisterSkin(skin)或LogClearSkins
示例
SDK 调用
cpp
#include "OLAPlugServer.h"
#include <cstdio>
void OLA_CALL_TYPE OnUiLog(int32_t level, void* rawMessage, void* formattedMessage,
int64_t userData) {
(void)userData;
const char* raw = rawMessage ? (const char*)rawMessage : "";
const char* formatted = formattedMessage ? (const char*)formattedMessage : "";
std::printf("[UI] L=%d %s | %s\n", level, raw, formatted);
}
OLAPlugServer ola;
int skinUi = ola.LogRegisterSkin((int64_t)(void*)&OnUiLog, 0);
if (skinUi != 0) {
long logger = ola.LogCreateInstance("UiLogger");
ola.LogSetAsync(logger, 0); // 测试时建议同步,便于立刻收到回调
ola.LogSetTarget(logger, 1 | skinUi); // FILE | skinUi
ola.LogInfoEx(logger, "hello skin");
ola.LogFlush(logger);
}csharp
using System;
using System.Runtime.InteropServices;
using OLAPlug;
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate void LogSkinCallback(int level, IntPtr rawMessage, IntPtr formattedMessage,
long userData);
void OnUiLog(int level, IntPtr rawMessage, IntPtr formattedMessage, long userData)
{
string raw = Marshal.PtrToStringAnsi(rawMessage) ?? "";
string formatted = Marshal.PtrToStringAnsi(formattedMessage) ?? "";
Console.WriteLine($"[UI] L={level} {raw} | {formatted}");
}
var ola = new OLAPlugServer();
LogSkinCallback cb = OnUiLog;
int skinUi = ola.LogRegisterSkin(Marshal.GetFunctionPointerForDelegate(cb).ToInt64(), 0);
if (skinUi != 0)
{
long logger = ola.LogCreateInstance("UiLogger");
ola.LogSetAsync(logger, 0);
ola.LogSetTarget(logger, 1 | skinUi);
ola.LogInfoEx(logger, "hello skin");
ola.LogFlush(logger);
GC.KeepAlive(cb);
}python
from OLAPlugServer import OLAPlugServer
# COM/脚本侧通常传入回调地址(int);具体封装以当前 SDK 为准
ola = OLAPlugServer()
skin = ola.LogRegisterSkin(callback_addr, 0)
if skin != 0:
logger = ola.LogCreateInstance("UiLogger")
ola.LogSetTarget(logger, 1 | skin)
ola.LogInfoEx(logger, "hello skin")java
import com.olaplug.OLAPlugServer;
OLAPlugServer ola = new OLAPlugServer();
// 回调地址按当前 Java SDK 约定传入
int skin = ola.LogRegisterSkin(callbackAddr, 0L);
if (skin != 0) {
long logger = ola.LogCreateInstance("UiLogger");
ola.LogSetTarget(logger, 1 | skin);
ola.LogInfoEx(logger, "hello skin");
}go
import "github.com/ola/olaplug/olaplug"
ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
skin := ola.LogRegisterSkin(callbackAddr, 0)
if skin != 0 {
logger := ola.LogCreateInstance("UiLogger")
ola.LogSetTarget(logger, 1|skin)
ola.LogInfoEx(logger, "hello skin")
}rust
use olaplug::OLAPlugServer;
let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let skin = ola.log_register_skin(callback_addr, 0);
if skin != 0 {
let logger = ola.log_create_instance("UiLogger");
ola.log_set_target(logger, 1 | skin);
ola.log_info_ex(logger, "hello skin");
}cpp
var ola = com("OlaPlug.OlaSoft")
// 回调地址按 TC 封装约定传入
var skin = ola.LogRegisterSkin(callbackAddr, 0)
if(skin != 0) {
var logger = ola.LogCreateInstance("UiLogger")
ola.LogSetTarget(logger, 1 | skin)
ola.LogInfoEx(logger, "hello skin")
}vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
' 回调地址按插件封装约定传入
skin = ola.LogRegisterSkin(callbackAddr, 0)
If skin <> 0 Then
logger = ola.LogCreateInstance("UiLogger")
Call ola.LogSetTarget(logger, 1 Or skin)
Call ola.LogInfoEx(logger, "hello skin")
End Iftext
.局部变量 ola, OLAPlug
ola.创建 ()
skin = ola.LogRegisterSkin (回调地址, 0)
.如果真 (skin ≠ 0)
logger = ola.LogCreateInstance (“UiLogger”)
ola.LogSetTarget (logger, 位或 (1, skin))
ola.LogInfoEx (logger, “hello skin”)
.如果真结束aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var skin = ola.LogRegisterSkin(callbackAddr, 0);
if(skin != 0){
var logger = ola.LogCreateInstance("UiLogger");
ola.LogSetTarget(logger, 1 | skin);
ola.LogInfoEx(logger, "hello skin");
}text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
整数 skin = ola.LogRegisterSkin(回调地址, 0)
如果真 (skin ≠ 0)
{
长整数 logger = ola.LogCreateInstance("UiLogger")
ola.LogSetTarget(logger, 位或(1, skin))
ola.LogInfoEx(logger, "hello skin")
}cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
int32_t skin = ola.LogRegisterSkin((int64_t)(void*)&OnUiLog, 0);
if (skin != 0) {
int64_t logger = ola.LogCreateInstance("UiLogger");
ola.LogSetTarget(logger, 1 | skin);
ola.LogInfoEx(logger, "hello skin");
}原生 DLL 调用
cpp
#include "olaplug/ola_logger.h"
void OLA_CALL_TYPE OnUiLog(int32_t level, void* rawMessage, void* formattedMessage,
int64_t userData);
int32_t skin = LogRegisterSkin(instance, OnUiLog, 0);
LogSetTarget(instance, logger, OLA_LOG_TARGET_FILE | skin);csharp
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int LogRegisterSkin(long ola, long callback, long userData);
int skin = LogRegisterSkin(instance,
Marshal.GetFunctionPointerForDelegate(cb).ToInt64(), 0);python
from ctypes import CFUNCTYPE, c_int, c_int64, c_void_p, CDLL
LogSkinCb = CFUNCTYPE(None, c_int, c_void_p, c_void_p, c_int64)
@LogSkinCb
def on_ui_log(level, raw, formatted, user_data):
pass
ola = CDLL("OLAPlug_x64.dll")
skin = ola.LogRegisterSkin(instance, on_ui_log, 0)注意事项
| 项目 | 说明 |
|---|---|
| 全局注册 | 与 logger 句柄无关;多个 logger 可共用同一 Skin 位。 |
| 位分配 | 从 1<<8 起,最多 24 个;LogUnregisterSkin 后该位可复用。 |
| 顺序 | 先 LogRegisterSkin 再 LogSetTarget;不可先写“未知 bit”。 |
| 级别过滤 | 被 LogSetLevel 过滤的日志不会触发回调。 |
| 字符串编码 | 回调字符串按 DefaultReturnEncoding(0=GBK / 1=UTF-8 / 2=Unicode)输出,与 API 返回字符串一致。 |
| 调用约定 | 回调必须 OLA_CALL_TYPE(stdcall);x86/x64 双架构请统一声明。 |
| 进程内 | 不跨进程转发回调指针。 |
| COM | COM 侧 callback 一般为回调函数地址(int64)。 |
相关接口
| 接口 | 说明 |
|---|---|
| OLALogSkinCallback | 回调类型。 |
| LogUnregisterSkin | 注销。 |
| LogClearSkins | 清空全部。 |
| LogSetTarget | 绑定到 logger。 |
